#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ATcommand.h"

// 定义处理AT指令的函数类型
typedef void (*AtCmdHandler)(const char*);

// AT指令注册结构体 ，改到ATcommand.h文件中定义
// typedef struct {
//     char* cmd;           // AT指令关键字（不包含"AT+"）
//     AtCmdHandler handler; // 处理该AT指令的函数指针
// } AtCmdRegistry;

// 动态数组指针和大小
AtCmdRegistry* cmdRegistry = NULL;
size_t registrySize = 0;

// 注册AT指令的函数
int registerAtCommand(const char* cmd, AtCmdHandler handler) {
    if (cmd == NULL || handler == NULL) {
        return -1; // 参数错误
    }

    // 分配或重新分配内存以容纳新条目
    AtCmdRegistry* newRegistry = (AtCmdRegistry*)realloc(cmdRegistry, (registrySize + 1) * sizeof(AtCmdRegistry));
    if (newRegistry == NULL) {
        // 处理内存分配失败的情况，可能需要释放原始cmdRegistry并返回错误
        free(cmdRegistry);
        return -1; // 或其他合适的错误处理方式
    }
    cmdRegistry = newRegistry;

    // 为cmd分配内存并复制字符串
    cmdRegistry[registrySize].cmd = strdup(cmd);
    if (cmdRegistry[registrySize].cmd == NULL) {
        free(cmdRegistry[--registrySize].cmd); // 如果cmd复制失败，释放cmd并回退registrySize
        return -1;
    }
    cmdRegistry[registrySize].handler = handler;
    registrySize++;

    return 0; // 成功注册
}

// 解析AT指令的函数
void parseAtCommand(const char* input) {
    if (strncmp(input, "AT+", 3) != 0) {
        // printf("Invalid AT command format.\n");//AT指令前缀错误信息打印
        return;
    }

    // 移除"AT+"前缀
    const char* cmdStart = input + 3;

    // 遍历注册表执行匹配的命令处理函数
    for (size_t i = 0; i < registrySize; ++i) {
        if (strstr(cmdStart, cmdRegistry[i].cmd) == cmdStart) {
            const char* eqPos = strchr(cmdStart + strlen(cmdRegistry[i].cmd), '=');
            if (eqPos != NULL) {
                cmdRegistry[i].handler(eqPos + 1);
            } else {
                cmdRegistry[i].handler(NULL);//无参数
            }
            return;
        }
    }

    printf("Unrecognized AT command: %s\n", cmdStart);
}

// 清理函数，释放动态分配的内存
void cleanupAtCommands() {
    for (size_t i = 0; i < registrySize; ++i) {
        free(cmdRegistry[i].cmd);
    }
    free(cmdRegistry);
    registrySize = 0;
    cmdRegistry = NULL;
}

// 示例处理函数
void handleTestCmd(const char* param) {
    printf("Handling 'TEST' command with parameter: %s\n", param ? param : "(no parameter)");
}
// 函数定义:从一段字符串中解析出双引号中的字符串并将这个字符串复制给一个数组,并返回双引号结尾的指针。findQuoteStr数组空间需要注意防止溢出
char *extractQuotedString(const char* input, char* findQuoteStr) {
    char* startQuote = strchr(input, '\"'); // 查找第一个双引号
    if (startQuote == NULL) return NULL; // 如果找不到双引号则直接返回

    char* endQuote = strchr(startQuote + 1, '\"'); // 查找结束的双引号
    if (endQuote == NULL) return NULL; // 如果找不到结束的双引号则直接返回

    // 计算字符串长度并减去两个双引号字符
    size_t length = endQuote - startQuote - 1;

    // 复制内容到ssid数组，跳过第一个双引号
    strncpy(findQuoteStr, startQuote + 1, length);
    findQuoteStr[length] = '\0'; // 确保字符串末尾有'\0'
    return endQuote;
}
// 示例处理函数 调用测试
int AtCommand_test() {
    // 注册AT指令
    if (registerAtCommand("TEST", handleTestCmd) != 0) {
        printf("Failed to register AT command.\n");
    }

    // 测试解析
    parseAtCommand("AT+TEST=Hello"); // 应调用handleTestCmd

    // 清理
    cleanupAtCommands();

    return 0;
}